home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 011-020 / amok12 / module / inout2.mod < prev    next >
Text File  |  1993-11-04  |  7KB  |  343 lines

  1. (*---------------------------------------------------------------------------
  2.     :Program.    InOut2.mod
  3.     :Author.     Bernd Preusing
  4.     :Address.    Gerhardstr. 16  D-2200 Elmshorn
  5.     :Phone.      04121/22486
  6.     :Shortcut.   [bep]
  7.     :Version.    1.1
  8.     :Date.       09-Nov-88
  9.     :Copyright.  PD
  10.     :Language.   Modula-II
  11.     :Translator. M2Amiga
  12.     :Imports.    Assembler
  13.     :UpDate.     Changed 'count' in ReadCount to VAR, so actual read length
  14.          is returned.
  15.     :Contents.   Added some procedures to InOut
  16.     :Remark.     SetInput und SetOutput dienen dazu, auch Kommandozeilen-
  17.          Parameter direkt zu übergeben und so OpenInput und
  18.          OpenOutput zu umgehen.
  19.          WriteCount, ReadCount sollen FileSystem überflüssig machen.
  20. ---------------------------------------------------------------------------*)
  21. IMPLEMENTATION MODULE InOut2;
  22.  
  23. FROM SYSTEM IMPORT ADR, ADDRESS, BYTE, INLINE, CAST;
  24.  
  25. FROM ASCII IMPORT
  26.     nul, eof;
  27.  
  28. FROM Arts IMPORT
  29.     TermProcedure;
  30.  
  31. FROM Conversions IMPORT
  32.     StrToVal, ValToStr;
  33.  
  34. IMPORT Dos;
  35.  
  36. IMPORT Terminal;
  37.  
  38. FROM Scan IMPORT
  39.     ScanString;
  40.  
  41.  
  42. CONST
  43.    RTS = 4E75H;
  44.    msOut = 'out>';
  45.    msIn  = 'in>';
  46.  
  47. VAR
  48.    InHandle, OutHandle: Dos.FileHandlePtr;
  49.  
  50.  
  51. PROCEDURE GetName(VAR str,defExt:ARRAY OF CHAR);
  52. VAR len,pos:INTEGER;
  53. BEGIN
  54.   ScanString(Terminal.Read,str,len,termCh);
  55.   IF (len > 0) AND (str[len-1] = '.') THEN
  56.     pos:=0;
  57.     WHILE (len<=HIGH(str)) AND (pos<=HIGH(defExt)) AND (defExt[pos]#nul) DO
  58.       str[len]:=defExt[pos];
  59.       INC(len);
  60.       INC(pos);
  61.     END;
  62.     str[len]:=nul;
  63.   ELSE
  64.     IF len=0 THEN
  65.       termCh:=nul
  66.     END
  67.   END
  68. END GetName;
  69.  
  70. PROCEDURE OpenInput(defExt:ARRAY OF CHAR);
  71. VAR str:ARRAY[0..99] OF CHAR;
  72. BEGIN
  73.   Terminal.WriteString(msIn);
  74.   GetName(str,defExt);
  75.   InHandle:=Dos.Open(ADR(str),Dos.oldFile);
  76.   done:=(InHandle#NIL)
  77. END OpenInput;
  78.  
  79. PROCEDURE OpenOutput(defExt:ARRAY OF CHAR);
  80. VAR str:ARRAY[0..99] OF CHAR;
  81. BEGIN
  82.   Terminal.WriteString(msOut);
  83.   GetName(str,defExt);
  84.   OutHandle:=Dos.Open(ADR(str),Dos.newFile);
  85.   done:=(OutHandle#NIL)
  86. END OpenOutput;
  87.  
  88. PROCEDURE SetInput(name: ARRAY OF CHAR);
  89. BEGIN
  90.   InHandle:=Dos.Open(ADR(name),Dos.oldFile);
  91.   done:=(InHandle#NIL)
  92. END SetInput;
  93.  
  94. PROCEDURE SetOutput(name: ARRAY OF CHAR);
  95. BEGIN
  96.   OutHandle:=Dos.Open(ADR(name),Dos.newFile);
  97.   done:=(OutHandle#NIL)
  98. END SetOutput;
  99.  
  100. PROCEDURE CloseInput();
  101. BEGIN
  102.   IF InHandle#NIL THEN
  103.     Dos.Close(InHandle)
  104.   END;
  105.   InHandle:=NIL;
  106.   done:=TRUE
  107. END CloseInput;
  108.  
  109. PROCEDURE CloseOutput();
  110. BEGIN
  111.   IF OutHandle#NIL THEN
  112.     Dos.Close(OutHandle)
  113.   END;
  114.   OutHandle:=NIL;
  115.   done:=TRUE
  116. END CloseOutput;
  117.  
  118. PROCEDURE Write(ch: CHAR);
  119. BEGIN
  120.   IF OutHandle#NIL THEN
  121.     done:= (Dos.Write(OutHandle,ADR(ch),1)=1)
  122.   ELSE
  123.     Terminal.Write(ch);
  124.     done:=TRUE
  125.   END
  126. END Write;
  127.  
  128. PROCEDURE WriteBytes(VAR blk: ARRAY OF BYTE);
  129. BEGIN
  130.   IF OutHandle#NIL THEN
  131.     done:= (Dos.Write(OutHandle,ADR(blk),HIGH(blk)+1) =HIGH(blk)+1)
  132.   ELSE
  133.     done:=FALSE
  134.   END
  135. END WriteBytes;
  136.  
  137. PROCEDURE WriteCount(adr: ADDRESS; count: LONGINT);
  138. BEGIN
  139.   IF OutHandle#NIL THEN
  140.     done:= (Dos.Write(OutHandle,adr,count) =count)
  141.   ELSE
  142.     done:=FALSE
  143.   END
  144. END WriteCount;
  145.  
  146. PROCEDURE WriteString(str: ARRAY OF CHAR);
  147. VAR len:LONGINT;
  148. BEGIN
  149.   IF OutHandle#NIL THEN
  150.     len:=0;
  151.     WHILE (len<=HIGH(str)) AND (str[len]#nul) DO
  152.       INC(len)
  153.     END;
  154.     done:= (Dos.Write(OutHandle,ADR(str),len)=len)
  155.   ELSE
  156.     Terminal.WriteString(str);
  157.     done:=TRUE
  158.   END
  159. END WriteString;
  160.  
  161. (* $E- *) (* geht nur, weil keine Parameter und keine Lokalvariablen! *)
  162. PROCEDURE WriteLn();
  163. BEGIN
  164.   Write(eol);
  165.   INLINE(RTS)
  166. END WriteLn;
  167.  
  168. PROCEDURE Read(VAR ch: CHAR);
  169. BEGIN
  170.   IF InHandle#NIL THEN
  171.     IF Dos.Read(InHandle,ADR(ch),1)#1 THEN
  172.       ch:=eof (* Ctrl-\ *)
  173.     END;
  174.   ELSE
  175.     Terminal.Read(ch)
  176.   END;
  177.   done:=TRUE
  178. END Read;
  179.  
  180. PROCEDURE ReadBytes(VAR blk: ARRAY OF BYTE);
  181. BEGIN
  182.   IF InHandle#NIL THEN
  183.     done:=(Dos.Read(InHandle,ADR(blk),HIGH(blk)+1) = HIGH(blk)+1)
  184.   ELSE
  185.     done:=FALSE
  186.   END;
  187. END ReadBytes;
  188.  
  189. PROCEDURE ReadCount(adr: ADDRESS; VAR count: LONGINT);
  190. VAR IsCount: LONGINT;
  191. BEGIN
  192.   IF InHandle#NIL THEN
  193.     IsCount:=Dos.Read(InHandle,adr,count);
  194.     done:= (IsCount = count);
  195.     count:=IsCount
  196.   ELSE
  197.     done:=FALSE
  198.   END;
  199. END ReadCount;
  200.  
  201. PROCEDURE ReadString(VAR str: ARRAY OF CHAR);
  202. VAR len: INTEGER;
  203. BEGIN
  204.   ScanString(Read,str,len,termCh);
  205.   done:=(len#0)
  206. END ReadString;
  207.  
  208. PROCEDURE ReadLn(VAR str: ARRAY OF CHAR; VAR len: INTEGER);
  209. TYPE CharPtr = POINTER TO CHAR;
  210. VAR Pos, i, actlen: LONGINT;
  211.     cp: CharPtr;
  212. BEGIN
  213.   IF InHandle#NIL THEN
  214.     Pos:=Dos.Seek(InHandle,0,Dos.current); (* Zeilenanfang merken *)
  215.     actlen:=Dos.Read(InHandle,ADR(str),HIGH(str)+1); (* soviel wie möglich *)
  216.     IF actlen<=0 THEN
  217.       done:=FALSE;
  218.       termCh:=eof;
  219.       len:=0;
  220.       str[0]:=nul
  221.     ELSE
  222.       i:=0; (* $V- $R- *)
  223.       cp:=CAST(CharPtr,ADR(str));
  224.       WHILE (i<actlen) AND (cp^#eol) DO INC(i); INC(cp) END;
  225.       IF i<actlen THEN (* ist eol *)
  226.         cp^:=nul;
  227.         termCh:=eol
  228.       ELSE
  229.         termCh:=cp^; (* kein Zeilenende erreicht *)
  230.       END;
  231.       (* $V= $R= *)
  232.       Pos:=Dos.Seek(InHandle,Pos+i+1,Dos.beginning); (* auf nächste Zeile *)
  233.       len:=i;
  234.       done:=TRUE;
  235.     END;
  236.   ELSE
  237.     Terminal.ReadLn(str,len);
  238.     termCh:=eol;
  239.     done:=TRUE
  240.   END;
  241. END ReadLn;
  242.  
  243. PROCEDURE WriteInt(x: LONGINT; n: INTEGER);
  244. VAR str: ARRAY[0..99] OF CHAR;
  245. BEGIN
  246.   ValToStr(x,TRUE,str,10,n,' ',done);
  247.   done:=NOT done; (* kein error *)
  248.   IF done THEN
  249.     WriteString(str)
  250.   END
  251. END WriteInt;
  252.  
  253. PROCEDURE WriteCard(x: LONGCARD; n: INTEGER);
  254. VAR str: ARRAY[0..99] OF CHAR;
  255. BEGIN
  256.   ValToStr(CAST(LONGINT,x),FALSE,str,10,n,' ',done);
  257.   done:=NOT done; (* kein error *)
  258.   IF done THEN
  259.     WriteString(str)
  260.   END
  261. END WriteCard;
  262.  
  263. PROCEDURE WriteOct(x: LONGINT; n: INTEGER);
  264. VAR str: ARRAY[0..99] OF CHAR;
  265. BEGIN
  266.   ValToStr(x,FALSE,str,8,n,'0',done);
  267.   done:=NOT done; (* kein error *)
  268.   IF done THEN
  269.     WriteString(str)
  270.   END
  271. END WriteOct;
  272.  
  273. PROCEDURE WriteHex(x: LONGINT; n: INTEGER);
  274. VAR str: ARRAY[0..99] OF CHAR;
  275. BEGIN
  276.   ValToStr(x,FALSE,str,16,n,'0',done);
  277.   done:=NOT done; (* kein error *)
  278.   IF done THEN
  279.     WriteString(str)
  280.   END
  281. END WriteHex;
  282.  
  283. PROCEDURE ReadInt(VAR x: INTEGER);
  284. VAR str: ARRAY[0..99] OF CHAR;
  285.     l:LONGINT;
  286.     signed: BOOLEAN;
  287. BEGIN
  288.   ReadString(str);
  289.   StrToVal(str,l,signed,10,done);
  290.   done:= (NOT done) AND (signed AND (l>= MIN(INTEGER)) OR 
  291.           (CAST(LONGCARD,l)<= CAST(LONGCARD,MAX(INTEGER))));
  292.   IF done THEN
  293.     x:=l
  294.   END;
  295. END ReadInt;
  296.  
  297. PROCEDURE ReadCard(VAR x: CARDINAL);
  298. VAR str: ARRAY[0..99] OF CHAR;
  299.     l:LONGINT;
  300.     signed: BOOLEAN;
  301. BEGIN
  302.   ReadString(str);
  303.   StrToVal(str,l,signed,10,done);
  304.   done:= (NOT done) AND (CAST(LONGCARD,l)<=MAX(CARDINAL));
  305.   IF done THEN
  306.     x:=CARDINAL(l)
  307.   END;
  308. END ReadCard;
  309.  
  310. PROCEDURE ReadLongInt(VAR x: LONGINT);
  311. VAR str: ARRAY[0..99] OF CHAR;
  312.     signed: BOOLEAN;
  313. BEGIN
  314.   ReadString(str);
  315.   StrToVal(str,x,signed,10,done);
  316.   done:= (NOT done) AND (signed OR (x>=0));
  317. END ReadLongInt;
  318.  
  319. PROCEDURE ReadLongCard(VAR x: LONGCARD);
  320. VAR str: ARRAY[0..99] OF CHAR;
  321.     l:LONGINT;
  322.     signed: BOOLEAN;
  323. BEGIN
  324.   ReadString(str);
  325.   StrToVal(str,l,signed,10,done);
  326.   done:= (NOT done) AND (NOT signed);
  327.   IF done THEN
  328.     x:=CAST(LONGCARD,l)
  329.   END;
  330. END ReadLongCard;
  331.  
  332. PROCEDURE Cleanup();
  333. BEGIN
  334.   CloseInput;
  335.   CloseOutput
  336. END Cleanup;
  337.  
  338. BEGIN
  339.   InHandle:=NIL;
  340.   OutHandle:=NIL;
  341.   TermProcedure(Cleanup)
  342. END InOut2.mod
  343.